#include <iostream>

using std::cout;
using std::endl;

void print() 
{
    cout << "print()" << endl;
}

void display()
{
    cout << "display()" << endl;
}


//将函数看成是一种类型
//void()   a;
//void() * p = &a;

//对函数类型 void() 进行重定义，
//取了一个新的名字叫Function
typedef void (*Function)();

void test0()
{
    //函数名本质上就是一个函数的入口地址
    printf("print's address: %p\n", print);
    //打印为1， 是因为cout的类型转换操作，返回的是bool类型
    //不为0的时候，就打印为1
    cout << "print:" << print << endl;
    //函数指针
    void(*p)() = print;
    p();

    //将函数指针改变指向，指向display函数的入口
    p = &display;
    (*p)();

    Function f = print;
    f();
    f = display;
    f();
}

//将函数指针作为函数的参数
void myFunc(Function f) 
{
    f();//回调函数的调用
}

int gnum = 1;

int * test1()
{
    return &gnum;
}

int main() 
{
    //注册（初始化）回调函数
    myFunc(print);
    myFunc(display);

    int * p = test1();
    cout << "*p:" << *p << endl;
    return 0;
}

